package com.gitee.fastmybatis.core.ext.transaction;

import com.gitee.fastmybatis.core.ext.util.MybatisUtil;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.transaction.TransactionException;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;

public interface DbSupport {

    /**
     * 返回数据源别名,对应application配置中的别名
     *
     * @return 别名
     */
    String getDataSourceAlias();

    /**
     * 执行事务操作, 报错自动回滚
     *
     * @param action 业务逻辑
     * @param <T>    返回结果类型
     * @return 返回结果
     * @throws TransactionException
     */
    default <T> T doTransaction(TransactionCallback<T> action) throws TransactionException {
        return MybatisUtil.doTransaction(getDataSourceAlias(), action);
    }

    /**
     * 执行事务操作(没有返回结果)
     *
     * @param action 业务逻辑
     * @throws TransactionException
     */
    default void doTransactionNoResult(TransactionCallback<?> action) throws TransactionException {
        doTransaction(action);
    }

    /**
     * 获取数据源对应的TransactionTemplate
     *
     * @return TransactionTemplate
     */
    default TransactionTemplate getTransactionTemplate() {
        return MybatisUtil.getTransactionTemplate(getDataSourceAlias());
    }

    /**
     * 获取SqlSessionFactory
     *
     * @return 返回数据源对应的SqlSessionFactory
     */
    default SqlSessionFactory getSqlSessionFactory() {
        return MybatisUtil.getSqlSessionFactory(getDataSourceAlias());
    }

}
